/**
 * 弹窗
 * 
 * ??在窗口最小化，弹窗的位置在body外面时，会有部分没有盖住
 * 
 * linruiyan@2012-7-29 如果在iframe中被加载，那么判断父框架是否已经存在，如果存在直接调用
 * 
 */






//界面组件
var ui = (!!parent.ui)?parent.ui:{
		
		id:'pop',
		
		handle:null,
		sunblind:null,
		main:null,
		iframe:null,
		data:null,
		hbox:null,		//隐藏的盒子，存放所有pop
		lasturl:null,
		currenturl:null,
		//创建一个带有工具栏，状态栏的div
		init:function(){
			//linruiyan@2012-10-7 纠正初始化被重复多次执行，导致创建了多个id="pop"
			if(this.main){
				return false;
			}
			//初始化主板
			$('body').append('<div id="'+this.id+'"></div>');
			this.handle = $('#'+this.id);
			
			
			
			//初始化百叶窗
			this.sunblind = $('<div />').
										addClass('sunblind').
										appendTo(this.handle).
										//width($('body').width()).
										height($(document).height()).
										append('<iframe style="width:98%;border:0px;height:100%;filter:alpha(opacity=0);-moz-opacity:0"></iframe>');
			
			//初始化弹窗框架
			this.main = $('<div />').addClass('ply-html').appendTo(this.handle);
			var bar = $('<div />').addClass('ply-bar');
			$('<a />').addClass('ply-close').html('<img src="/skin/img/m2/bg09.gif">').click(ui.close).appendTo(bar);
			$('<span />').addClass('ply-title').html('窗口').appendTo(bar);
			bar.prependTo(this.main);
			
			$('<div />').addClass('ply-body').appendTo(this.main);
			$('<div />').addClass('ply-footer').appendTo(this.main);
			
			this.hbox = $('<div />').addClass('ply-hidden').appendTo(this.main);

			//初始化伪ajax的iframe
			this.iframe = $('<iframe />').attr('name','pajax').attr('id','ply-iframe').addClass('ply-iframe').appendTo(this.handle).load(function(){
				ui.fresh();
			});

			
		},
		
		submit:function(obj){
			$(obj).attr('target','pajax');
			
		},
		//linruiyan@2013年5月13日 添加了一个获取html
		getPajax:function(url){
			this.iframe.attr("src",url);
		},
		
		pop:function(obj){
			//alert(obj.attr("innerHTML"));
			//ui.main.find('.ply-body').append(obj.attr("innerHTML"));
			// ui.replaceHtml(obj);
			ui.main.find('.ply-body').append(obj);
			this.main.show();
			this.sunblind.show();	
			this.resetPoistion();
			//cityShowCallback();
		},
		
		/**
		 * state
		 * data
		 * callback
		 * 
		 * 2013年11月26日 尝试加入一些自动显示标题的功能。但不好搞定。其次不好用。比如：修改的全是修改
		 */
		open:function(url,param){

			this.lasturl = this.currenturl;//上一个访问url为最后url
			this.currenturl = url;//当前url为访问url
			
			this.loadingHtml();
			this.main.show();
			ui.resetPoistion();
			this.sunblind.show();
			if(/\?/.test(url)){
				url += '&cb=?';
			}else{
				url += '?cb=?';
			}
			url +='&type=ajax';

			$.getJSON(url,param,function(data){
				ui.data = data;
				ui.fresh();
			}); 			
		},
		comfirm:function(str,url,param){
			ui.replaceHtml('');
			ui.main.find('.ply-body').append($('<div />').addClass('alert').text(str));
			
			;
			this.setFooter($('<a />')
					.text("确定")
					.attr("href","javascript:void(0);")
					.addClass('button')
					.click(function(){
							ui.loadingHtml();
							ui.open(url, param);
							$(this).unbind("click");
							$(this).css({color:"#999"});
							//alert(1);
						}));
			this.main.show();
			this.sunblind.show();	
			this.resetPoistion();
			
		},
		
		golast:function(){
			//如果弹窗被关闭，那么就不要再次刷新了
			if('block'==$(this.main).css('display')){
				var url = this.lasturl;
				this.lasturl = null;
				if(url==null){
					this.close();
				}else{
					this.open(url);
				}

			}
		},
		fresh:function(){
			
			
			//在第一次加载时，会返回烦人的null
			if(!ui.data)return false;
			
			var data = ui.data;
			if('append'==data.fresh){
				
			}else if('nothing'==data.fresh){
				return false;
			}else{
				ui.replaceHtml('');
				this.main.find('.ply-footer').hide();
			}
			data.msg = "<div>"+data.msg+"</div>";
			$(data.msg).find('.notice').each(function(){
				ui.prependHtml(this);
			});
			$(data.msg).find('.content').each(function(){
				ui.appendHtml(this);
			});
			$(data.msg).find('a').each(function(){
				var obj = $(this);
				
				if('javascript:'!=obj.attr("href").substr(0,11)){
					//alert(obj.attr("href"));
					obj.click = function(){
						alert($(this).attr('href'));
						alert(1);
						return false;
						obj.attr("href","javascript:void(0);");
						//ui.open(obj.attr('href'));
					};
				}
			});
			//return false;
			//下面这段代码会导致js重复执行，在setIntval时会导致混乱
			var script = data.msg.match(/<script[\S\s]*?script>/gi);
			if(script){
				$.each(script,function(){
					//alert(this.toString());
					//$('body').append(this.toString());
				});					
			}

			this.main.find('form').submit(function(){
				
				var url = $(this).attr('action');
				url += /\?/.test(url)?'&type=iframe':'?type=iframe';
				
				$(this).attr('action',url);
				ui.submit(this);
			});
			//linruiyan@2013年2月19日 如果弹窗中有图片，在图片加载完了之后再次调整弹窗尺寸和
			this.main.find("img").load(function(){
				ui.resetPoistion();
			});
			this.resetPoistion();
		},
		closeCallback:function(){},
		close:function(){
			ui.main.hide();
			ui.sunblind.hide();
			ui.closeCallback();
			//将pop数据返回hbox中
			ui.main.find(".pop").each(function(){
				ui.hbox.append(this);
			});
			//linruiyan@2012年9月5日 如果嵌套iframe，ui会持续存在。iframe调用弹窗后closeCallback会继续有效。需要重置为空
			ui.closeCallback = function(){};
			
			//linruiyan@2013年11月28日 在窗口关闭后，不能存在“返回”处理了。避免陷入“死循环”返回
			ui.lasturl = null;
		},

		setTitle:function(title){
			this.main.find('.ply-title').text(title);
		},
		setFooter:function(html){
			
			this.main.find('.ply-footer').html(html).show();
//			this.main.find('.ply-footer');
		},

		
		
		replaceHtml:function(html){
			ui.main.find('.ply-body').html(html);
		},
		appendHtml:function(html){
			ui.main.find('.ply-body').append(html);
		},
		prependHtml:function(html){
			ui.main.find('.ply-body').prepend(html);
		},
		
		
		loadingHtml:function(){

			ui.replaceHtml('<div>加载中...</div>');
			this.main.show();
			this.sunblind.show();	
			this.resetPoistion();

		},
		resetPoistion:function(){
			var top = 100;
			if(this.main.height()>=$(window).height()-100){
				this.main.height($(window).height()-100);
				top = 50;
			}
			this.main.css({left:($(document).width()-this.main.width())/2,top:$(document).scrollTop()+top});
			this.main.find('.ply-body').height('auto');	//重置ply-body的自然高度
			var barHeight = this.main.find('.ply-bar').outerHeight();
			var bodyHeight = this.main.find('.ply-body').outerHeight();//获取ply-body的自然高度
			var footerHeight = this.main.find('.ply-footer').outerHeight();//获取ply-footer的自然高度,footer带有padding，需要outerHeight才能准确计算出真正的高度
			//如果脚步隐藏了。那么就按0来段。
			if('none'==this.main.find('.ply-footer').css("display")){
				footerHeight = 0;
			}
			
			var maxHeight = bodyHeight + footerHeight+barHeight;
			//如果ply-body的自然高度大于窗口除去上下留白高度。那么约束在最大高度（window-200）
			var autoHeight = $(window).height()-100; 
			//alert(autoHeight);
			if(maxHeight>autoHeight){
				this.main.find('.ply-body').height(autoHeight-footerHeight-barHeight-20);
				bodyHeight = autoHeight-footerHeight-barHeight;
			}
			
			this.main.height("auto");
		}

};






$(document).ready(function(){	
	ui.init();

	$(window).resize(function(){
		//ui.sunblind.width($('body').width());
		//ui.resetPoistion();
	});
	
	$(window).scroll(function(){
		//ui.resetPoistion();
	});

	$(".pop").each(function(){
		ui.hbox.append(this);
	});

});







$(document).ready(function(){
	$(".n-tab").each(function(){
		var more = $("<div>")
						.addClass("n-tab-more")
						.addClass("n-right");
		var moreTab = $("<a>")
							.addClass("more")
							.text("更多");
		more.append(moreTab);
		more.append("<div>");
		
		var list = $("<div>")
						.addClass("n-tab-list")
						.wrapInner($(this).find("a"));
		$(this).append(more);
		$(this).append(list);
				




		var moreWidth = 200;
	
		var besides = 650;
		var totalWidth = 0;
		var maxWidth = 0;
		list.find("a").each(function(){
			var itemWidth = $(this).outerWidth();
			besides -= itemWidth;
			maxWidth = itemWidth>maxWidth?itemWidth:maxWidth;
			if(besides < 0){
				$(this).appendTo(".n-tab-more div");
				//如果出现当前标签在more里面，那么就将“更多”改为当前标签名
				if($(this).hasClass("current")){
					moreTab.text($(this).text());
				}
			}
		});

		if(besides>0)moreTab.hide();
			else if(besides>-500)moreWidth = 100;
			else if(besides>-1000)moreWidth = 200;
			else if(besides>-2000)moreWidth = 300;
			else if(besides>-3000)moreWidth = 400;
			else moreWidth = 500;
	
		moreWidth = moreWidth<maxWidth?maxWidth:moreWidth;
		
		more.hover(function(){
	
			more.find("div")
					.width(moreWidth)
					.show();
		},function(){
			more.find("div").hide();
		});

	});
});



function initSelect(obj){
	
	var that = $(obj);
	var id = $(obj).attr('id');
	
	//如果元素中未定义id，那么就采用name来识别身份
	//如果name相同，则无奈了
	if(!id){
		id = $(obj).attr('name');
	}
	
	id += '-shadow';
	var handle = $('#'+id);
	if(!handle.length){
		handle = $("<dl><dt></dt><dd></dd></dl>")
							.attr('id',id)
							.addClass('n-select')
							.insertAfter($(obj))
							.hover(function(){
								$(this).find('dd').show();
							},function(){
								$(this).find('dd').hide();
							});
		$(handle).find('dt').text('请选择');
	}else{
		$(handle).find('dd').empty();
	}
	var i = 0;
	$(obj).find("option").each(function(){
		var item = $("<div>")
					.attr("i",i)
					.text($(this).text())
					.click(function(){
						//alert(parseInt($(this).attr('i')))
						$(that).find("option")[parseInt($(this).attr('i'))].selected = true;
						//console.log($(that).find(".selected"))
						$(handle).find('dt').text($(this).text());
						$(that).trigger('change');
					});
	
		handle.find('dd').append(item);
		//console.log($(this).attr('selected'))
		if(i==0 || $(this).attr('selected'))item.click();

		i++;
	});
	
}


$(document).ready(function(){
	$("select").each(function(){

		initSelect(this);
	});
});


/**
 *卡片区域排版 
 */
$(document).ready(function(){
	var len = $(".n-card").length;
	for(i=2;i<len;){
		$(".n-card").eq(i).addClass('n-card-end');
		i+=3;
	}
});


/**
 * 复选框 
 */
$(document).ready(function(){
	$("input[type=checkbox]").each(function(){
		var id = $(this).attr('name')+':'+$(this).val();
		var that = this;
		var vCheckbox = $("<a><span>✔</span></a>")
					.addClass('n-checkbox')
					.attr('id',id)
					.insertAfter($(this))
					.click(function(){
						if(that.checked){
							that.checked = false;
							$(this).removeClass('checked');
							
							//重选时，除了重置that状态，this状态，还需要触发一个事件，让外部可捕获
							//认为checked状态的变化也是一种改变，所以触发了change事件
							$(that).trigger('change');
						}else{
							that.checked = true;
							$(this).addClass('checked');
							$(that).trigger('change');
						}
					})
					.bind('toggleClick',function(){
						if(that.checked){
							$(this).addClass('checked');
						}else{
							$(this).removeClass('checked');
							
						}
					});

		//在处理全选/反选中，通过虚拟checkbox选中来改变input
		//input的改变来改变其他所有的input
		//其他所有的input的改变来改变虚拟checkbox
		$(that).change(function(){
			vCheckbox.trigger('toggleClick');
		});

	});


	//复选框，全选
	$(".n-checkbox-all").change(function() {
		var gc = $(this).attr("groupclass");
		if(this.checked) {
			$("."+gc).each(function() {
				this.checked = true;
				$(this).trigger('change');
			});
		}
		else {
			$("."+gc).each(function() {
				this.checked = false;
				$(this).trigger('change');
			});
		}
	});

});



